﻿<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>v1.0 到 v1.1 的更改 | AutoHotkey v2</title>
<meta name="description" content="Changes between v1.0 and v1.1." />
<meta name="ahk:equiv-v1" content="Compat.htm" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="static/theme.css" rel="stylesheet" type="text/css" />
<script src="static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>
<h1>v1.0 到 v1.1 的更改</h1>

<p>本文档详细介绍了 AutoHotkey v1.0 和 v1.1 之间的变化, 这些变化可能会导致脚本的行为不同, 因此在阅读或更新旧代码时可能需要注意. 另请参阅: <a href="v2-changes.htm">v1.1 到 v2.0 的更改</a>.</p>
<p>AutoHotkey 1.1 也称为 "AutoHotkey_L", 而 AutoHotkey 1.0 则表示 "AutoHotkey Basic". AutoHotkey_L 的一些旧版本使用 1.0.* 版本号, 所以为了清晰, 这里的帮助中使用名称而不是版本号来区分 AutoHotkey 的两种分支.</p>

<h2 id="toc">目录</h2>
<p>高度影响:</p>
<ul>
  <li><a href="#Syntax_Errors">不再允许的一些语法错误</a></li>
  <li><a href="#FileRead">FileRead 可能返回损坏的二进制数据</a></li>
  <li><a href="#Names">变量和函数名中不允许使用 [, ] 或 ?</a></li>
  <li><a href="#DPIScale">DPI 比例缩放对于 GUI 是默认开启的</a></li>
</ul>
<p>中度影响:</p>
<ul>
  <li><a href="#Transform">Transform 的 <em>Unicode</em> 子命令在 Unicode 版本中不再可用</a></li>
  <li><a href="#Default_Script">运行 AutoHotkey.ahk 来代替 AutoHotkey.ini</a></li>
  <li><a href="#SetFormat">SetFormat, Integer, <strong>H</strong> 区分大小写</a></li>
  <li><a href="#LastError">A_LastError 会被更多的命令修改</a></li>
  <li><a href="#MsgBox">MsgBox 的逗号智能处理更加一致</a></li>
  <li><a href="#GuiOwner">Gui 的选项覆盖额外的样式</a></li>
  <li><a href="#Tilde">~颚化符(波浪号) 会影响自定义修饰键的工作方式</a></li>
  <li><a href="#ComboUpDown"><code>x &amp; y::</code> 会使得 <code>x::</code> 和 <code>x up::</code> 都会在 x 释放时触发</a></li>
</ul>
<p>低度影响:</p>
<ul>
  <li><a href="#IfIs">If <em>var</em> is <em>type</em> 默认忽略系统区域设置</a></li>
  <li><a href="#Window_Groups">GroupActivate 设置 ErrorLevel 和 GroupAdd 的 <em>Label</em> 作用的差异</a></li>
  <li><a href="#Run">Run 和 RunWait 解释 <em>Target</em> 的差异</a></li>
  <li><a href="#ControlZ">Control-Z 不会被解释为文件结束</a></li>
  <li><a href="#IsCompiled">A_IsCompiled 总是只读的</a></li>
  <li><a href="#DllCall">DllCall 在更多情况下尝试使用 A 或 W 后缀</a></li>
</ul>

<span id="Validation"></span><h2 id="Syntax_Errors">语法错误</h2>
<p>AutoHotkey_L 中不允许某些在 AutoHotkey Basic 中接受的语法错误. 识别出这些错误后, 其中大多数都很容易改正. 有些错误是在加载时检测到的, 必须在脚本运行前予以纠正. 其他的错误只有在脚本运行时满足特定条件时才会出现.</p>
<p>v2.0 版的错误检测一般来说更加稳健, 由于在错误检测和处理之外还有许多用法上的变化, 所以这里不列出 v1.0 版和 v1.1 版在错误检测方面的区别. 有关详情, 请参阅 v1.1 版的文档.</p>

<h2 id="FileRead">FileRead</h2>
<p>在某些常见情况下, <a href="commands/FileRead.htm#Binary">FileRead</a> 会在代码页之间转换文本, 因此可能输出错误的二进制数据. 要在 v2.0 版中避免此问题, 请添加 <code>RAW</code> 选项或使用 <a href="commands/FileOpen.htm">FileOpen</a> 代替.</p>

<h2 id="Names">变量和函数名称</h2>
<p>字符 <code>[</code>, <code>]</code> 和 <code>?</code> 被保留在<a href="Language.htm#expressions">表达式</a>中使用, 所以在变量名中不再合法. 因此, <code>?</code>(在<a href="Variables.htm#ternary">三元运算</a>中使用) 不再需要在两边加上空格. 在变量名中使用这些字符的 v1.0 版本的代码在 v1.1 版本中会有新的解释, 因此可能不会被检测出错误.</p>
<p>相关: <a href="Language.htm#operators-for-objects">对象的运算符</a>, <a href="v2-changes.htm#names">名称(v1.1 到 v2.0 的更改)</a></p>

<h2 id="DPIScale">DPI 缩放</h2>
<p><a href="objects/Gui.htm#DPIScale">DPI 缩放</a>对于脚本 GUI 是默认开启的, 以确保它们根据<a href="Variables.htm#ScreenDPI">系统 DPI 设置</a>缩放. 如果启用, 并且系统 DPI 设置不是 96(100%), 那么由 Gui 方法/属性接受或返回的位置和尺寸将与其他函数不兼容. 要禁用 DPI 缩放功能, 请使用 <code>MyGui.Opt("-DPIScale")</code>.</p>

<h2 id="Transform">Transform</h2>
<p>一些 <i>Transform</i> 子命令被修改或不可用:</p>
<ul>
  <li><code>Transform, Unicode</code> 只在 ANSI 版本的 AutoHotkey 中可用. 要将 Unicode 文本赋值到剪贴板, 请使用常规赋值. 另请参阅: <a href="commands/StrPut.htm">StrPut</a>/<a href="commands/StrGet.htm">StrGet</a>.</li>
  <li><code>Transform, HTML</code> 在 Unicode 版本的 AutoHotkey_L 中支持额外的功能.</li>
</ul>
<p><code>Transform</code> 本身在 v2.0 中被删除.</p>

<h2 id="Default_Script">默认脚本</h2>
<p>未指定脚本运行 AutoHotkey_L 时, 默认加载 .ahk 文件而不是 .ini. 这个文件的名称取决于当前执行程序的文件名. 有关详情, 请参阅 <a href="Scripts.htm#defaultfile">Script Filename</a>.</p>

<h2 id="SetFormat">SetFormat, Integer[Fast], H</h2>
<p>使用大写字母 H 时, 十六进制数字中 A-F 也将为大写. AutoHotkey Basic 总是使用小写形式的数字.</p>
<p>SetFormat 本身在 v2.0 中被删除. <code>Format("0x{:x}", n)</code> 产生小写字母 a-f, 而 <code>Format("0x{:X}", n)</code> 产生大写字母 A-F.</p>

<h2 id="LastError">A_LastError</h2>
<p>现在后面的这些命令会设置 <a href="Variables.htm#LastError">A_LastError</a> 来辅助调试: FileAppend, FileRead, FileReadLine, FileDelete, FileCopy, FileMove, FileGetAttrib/Time/Size/Version, FileSetAttrib/Time, FileCreateDir, RegRead, RegWrite, RegDelete. 使用这些命令的其中任何一个会覆盖 A_LastError 之前的值.</p>
<p>对于 v2.0, A_LastError 也由 IniRead, IniWrite 和 IniDelete 设置.</p>

<h2 id="MsgBox">MsgBox</h2>
<p>v1.0 和 v1.1 中的 MsgBox 有 "智能逗号处理", 以避免在未加引号的文本中转义逗号. 这种处理方式在两个版本中略有不同, 在阅读 v1.0 版本的代码时, 可能需要考虑到极少数情况. v2.0 完全使用表达式语法, 因此不需要对逗号进行任何特殊处理.</p>

<h2 id="GuiOwner">GUI 的 Owner 选项</h2>
<p>对 Gui 应用 <a href="objects/Gui.htm#Owner">+Owner</a> 选项还会移除 WS_CHILD 样式并设置 WS_POPUP 样式. 这样会破坏在设置这些样式 <em>之后</em> 使用 <code>+Owner</code> 设置 Gui 的父窗口的脚本.</p>

<h2 id="Tilde">颚化符(~) 和自定义组合键</h2>
<p>从 v1.1.14 起, 当一个按键作为修饰符用于自定义组合键时, <a href="Hotkeys.htm#Tilde">颚化符前缀</a>会影响该热键的工作方式.</p>

<h2 id="ComboUpDown">自定义组合键和 Down/Up 热键</h2>
<p>除了使用颚化符前缀的情况, 对于自定义修饰键会同时定义按键按下和弹起热键, 它们在该按键释放时都会触发. 例如, <code>x &amp; y::</code> 会使得 <code>x::</code> 和 <code>x up::</code> 都会在 x 释放时触发, 而以前 <code>x::</code> 是不会触发的.</p>

<h2 id="IfIs">If <em>var</em> is <em>type</em></h2>
<p><code>If <i>var</i> is <i>type</i></code> 在 v1.0 中默认将某些(可能是特有的区域) 非 ASCII 字符识别为字母/小写/大写, 而在 v1.1 中只有在使用 <code>StringCaseSense, Locale</code> 时才会如此. 同样, v2.0 版中的 <a href="commands/Is.htm">Is<em>Type</em></a> 函数只有在第二个参数是 <code>"Locale"</code> 时才会将非 ASCII 字符识别为字母.</p>

<h2 id="Window_Groups">窗口组</h2>
<p><a href="commands/GroupActivate.htm">GroupActivate</a> 只在 v1.1 中设置 ErrorLevel, 而不在 v1.0 或 v2.0 中设置.</p>
<p><a href="commands/GroupAdd.htm">GroupAdd</a> 的 <em>Label</em> 参数在 v1.0 和 v1.1 中的表现不同, 但在 v2.0 中被删除.</p>

<h2 id="Run">Run / RunWait</h2>
<p>AutoHotkey_L 对 <a href="commands/Run.htm">Run</a> 和 <a href="commands/Run.htm">RunWait</a> 命令解释 <em>Target</em> 参数的方式进行了一些改进. 这样能允许一些以前不工作的情况, 但在一些非常罕见的情况下, 也可能影响到已经在 AutoHotkey Basic 中正常工作的脚本. 新的行为如下:</p>
<ul>
  <li>如果 <i>Target</i> 以引号开始, 则到下一个引号之间的所有内容被视为要执行的操作, 一般为可执行文件.</li>
  <li>否则首个以空格结束并且为一个现有文件或以 .exe, .bat, .com, .cmd 或 .hta 结尾的子字符串被视为操作. 这样就允许 .ahk, .vbs 或 .lnk 等文件类型接受参数, 同时仍然允许运行 "已知" 的可执行文件(例如 wordpad.exe), 而不像以前的版本那样需要绝对路径.</li>
</ul>

<h2 id="ControlZ">Control-Z</h2>
<p><a href="commands/LoopRead.htm">Loop Read</a> 和 <a href="objects/File.htm#ReadLine">File.ReadLine</a> 不再把字符 <kbd>Ctrl</kbd>+<kbd>Z</kbd>(0x1A) 解释为文件结束标记. 任何的 <kbd>Ctrl</kbd>+<kbd>Z</kbd>, 即使某一个恰好出现在文件末尾, 都原样加载. <a href="commands/FileRead.htm">FileRead</a> 已经忽略这个字符, 所以不受这个问题的影响.</p>

<h2 id="IsCompiled">A_IsCompiled</h2>
<p>如果脚本没有被编译, <a href="Variables.htm#IsCompiled">A_IsCompiled</a> 也会被定义; 它的值在 v1.1 中是 <code>""</code>, 在 v2.0 中是 <code>0</code>. 以前它是未定义的, 这意味着如果脚本没有被编译, 诸如 <code>A_IsCompiled := 1</code> 这样的赋值是有效的. 现在在所有的情况下都被视为一个只读的内置变量.</p>

<h2 id="DllCall">DllCall</h2>
<p>当给 <a href="commands/DllCall.htm">DllCall</a> 的函数名不能被解析时, AutoHotkey_L 会自动在函数名上附加一个 "A"(ANSI) 或 "W"(Unicode), 而不管指定的是哪个 Dll. 相比之下, AutoHotkey Basic 仅对 User32.dll, Kernel32.dll, ComCtl32.dll 或 Gdi32.dll 中的函数添加 "A" 后缀.</p>

</body>
</html>